package timo.rabbitmq.test.study.topic;

import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import lombok.SneakyThrows;
import timo.rabbitmq.common.CommonUtils;

import java.util.Scanner;

/**
 * 主题模式.继承路由模式
 * 使用特定routingKey发送的消息将被传递到所有使用匹配bindingKey绑定的队列
 * * 可以通配单个单词。
 * # 可以通配零个或多个单词。
 * @author timo
 * @date 2022/7/6
 */
public class TopicTestMain {

    //producer
    //这里模拟耗时任务,发送的消息中,每个点使工作进程暂停一秒钟,例如"Hello..."将花费3秒钟来处理
    @SneakyThrows
    public static void main(String[] args) {
        Connection connection = CommonUtils.getConnection();
        Channel channel = connection.createChannel();

        //主题交换机
        //参数1: 交换机名
        //参数2: 交换机类型
        channel.exchangeDeclare("topic_logs", BuiltinExchangeType.TOPIC);
        while (true) {
            //控制台输入的消息发送到rabbitmq
            System.out.print("输入消息: ");
            String msg = new Scanner(System.in).nextLine();
            //如果输入的是"exit"则结束生产者进程
            if ("exit".equals(msg)) {
                break;
            }
            System.out.print("输入routingKey: ");
            //例子 : “stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”
            String routingKey = new Scanner(System.in).nextLine();

            //参数1: 交换机名
            //参数2: routingKey, 路由键,这里我们用日志级别,如"error","info","warning"
            //参数3: 其他配置属性
            //参数4: 发布的消息数据
            channel.basicPublish("topic_logs", routingKey, null, msg.getBytes());
            System.out.println("消息已发送: "+routingKey+" - "+msg);
        }
        connection.close();
        channel.close();
    }


}
